home *** CD-ROM | disk | FTP | other *** search
- *indent.txt* For Vim version 6.0. Last change: 2001 Sep 12
-
-
- VIM REFERENCE MANUAL by Bram Moolenaar
-
-
- This file is about indenting C programs and other files.
-
- 1. Indenting C programs |C-indenting|
- 2. Indenting by expression |indent-expression|
-
- ==============================================================================
- 1. Indenting C programs *C-indenting*
-
- The basics for C indenting are explained in section |30.2| of the user manual.
-
- Vim has options for automatically indenting C program files. These options
- affect only the indent and do not perform other formatting. For comment
- formatting, see |format-comments|.
-
- Note that this will not work when the |+smartindent| or |+cindent| features
- have been disabled at compile time.
-
- There are in fact four methods available for indentation:
- 'autoindent' uses the indent from the previous line.
- 'smartindent' is like 'autoindent' but also recognizes some C syntax to
- increase/reduce the indent where appropriate.
- 'cindent' Works more cleverly than the other two and is configurable to
- different indenting styles.
- 'indentexpr' The most flexible of all: Evaluates an expression to compute
- the indent of a line. When non-empty this method overrides
- the other ones. See |indent-expression|.
- The rest of this section describes the 'cindent' option.
-
- Note that 'cindent' indenting does not work for every code scenario. Vim
- is not a C compiler: it does not recognize all syntax.
-
- These four options control C program indenting:
- 'cindent' Enables Vim to perform C program indenting automatically.
- 'cinkeys' Specifies which keys trigger reindenting in insert mode.
- 'cinoptions' Sets your preferred indent style.
- 'cinwords' Defines keywords that start an extra indent in the next line.
-
- If 'lisp' is not on and 'equalprg' is empty, the "=" operator indents using
- Vim's built-in algorithm rather than calling an external program.
-
- See |autocommand| for how to set the 'cindent' option automatically for C code
- files and reset it for others.
-
- *cinkeys-format* *indentkeys-format*
- The 'cinkeys' option is a string that controls Vim's indenting in response to
- typing certain characters or commands in certain contexts. Note that this not
- only triggers C-indenting. When 'indentexpr' is not empty 'indentkeys' is
- used instead. The format of 'cinkeys' and 'indentkeys' is equal.
-
- The default is "0{,0},0),:,0#,!^F,o,O,e" which specifies that indenting occurs
- as follows:
-
- "0{" if you type '{' as the first character in a line
- "0}" if you type '}' as the first character in a line
- "0)" if you type ')' as the first character in a line
- ":" if you type ':' after a label or case statement
- "0#" if you type '#' as the first character in a line
- "!^F" if you type CTRL-F (which is not inserted)
- "o" if you type a <CR> anywhere or use the "o" command (not in
- insert mode!)
- "O" if you use the "O" command (not in insert mode!)
- "e" if you type the second 'e' for an "else" at the start of a
- line
-
- Characters that can precede each key:
- ! When a '!' precedes the key, Vim will not insert the key but will
- instead reindent the current line. This allows you to define a
- command key for reindenting the current line. CTRL-F is the default
- key for this. Be careful if you define CTRL-I for this because CTRL-I
- is the ASCII code for <Tab>.
- * When a '*' precedes the key, Vim will reindent the line before
- inserting the key. If 'cinkeys' contains "*<Return>", Vim reindents
- the current line before opening a new line.
- 0 When a zero precedes the key (but appears after '!' or '*') Vim will
- reindent the line only if the key is the first character you type in
- the line. When used before "=" Vim will only reindent the line if
- there is only white space before the word.
-
- When neither '!' nor '*' precedes the key, Vim reindents the line after you
- type the key. So ';' sets the indentation of a line which includes the ';'.
-
- Special key names:
- <> Angle brackets mean spelled-out names of keys. For example: "<Up>",
- "<Ins>" (see |key-notation|).
- ^ Letters preceded by a caret (^) are control characters. For example:
- "^F" is CTRL-F.
- o Reindent a line when you use the "o" command or when Vim opens a new
- line below the current one (e.g., when you type <Enter> in insert
- mode).
- O Reindent a line when you use the "O" command.
- e Reindent a line that starts with "else" when you type the second 'e'.
- : Reindent a line when a ':' is typed which is after a label or case
- statement. Don't reindent for a ":" in "class::method" for C++. To
- Reindent for any ":", use "<:>".
- =word Reindent when typing the last character of "word". "word" may
- actually be part of another word. Thus "=end" would cause reindenting
- when typing the "d" in "endif" or "endwhile". But not when typing
- "bend". Also reindent when completion produces a word that starts
- with "word". "0=word" reindents when there is only white space before
- the word.
- =~word Like =word, but ignore case.
-
- If you really want to reindent when you type 'o', 'O', 'e', '0', '<', '>',
- '*', ':' or '!', use "<o>", "<O>", "<e>", "<0>", "<<>", "<>>", "<*>", "<:>" or
- "<!>", respectively, for those keys.
-
- For an emacs-style indent mode where lines aren't indented every time you
- press Enter but only if you press Tab, I suggest:
- :set cinkeys=0{,0},:,0#,!<Tab>,!^F
- You might also want to switch off 'autoindent' then.
-
- Note: If you change the current line's indentation manually, Vim ignores the
- cindent settings for that line. This prevents vim from reindenting after you
- have changed the indent by typing <BS>, <Tab>, or <Space> in the indent or
- used CTRL-T or CTRL-D.
-
- *cinoptions-values*
- The 'cinoptions' option sets how Vim performs indentation. In the list below,
- "N" represents a number of your choice (the number can be negative). When
- there is an 's' after the number, Vim multiplies the number by 'shiftwidth':
- "1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc. You can use a
- decimal point, too: "-0.5s" is minus half a 'shiftwidth'. The examples below
- assume a 'shiftwidth' of 4.
-
- >N Amount added for "normal" indent. Used after a line that should
- increase the indent (lines starting with "if", an opening brace,
- etc.). (default 'shiftwidth').
-
- cino= cino=>2 cino=>2s >
- if (cond) if (cond) if (cond)
- { { {
- foo; foo; foo;
- } } }
- <
- eN Add N to the prevailing indent inside a set of braces if the
- opening brace at the End of the line (more precise: is not the
- first character in a line). This is useful if you want a
- different indent when the '{' is at the start of the line from
- when '{' is at the end of the line. (default 0).
-
- cino= cino=e2 cino=e-2 >
- if (cond) { if (cond) { if (cond) {
- foo; foo; foo;
- } } }
- else else else
- { { {
- bar; bar; bar;
- } } }
- <
- nN Add N to the prevailing indent for a statement after an "if",
- "while", etc., if it is NOT inside a set of braces. This is
- useful if you want a different indent when there is no '{'
- before the statement from when there is a '{' before it.
- (default 0).
-
- cino= cino=n2 cino=n-2 >
- if (cond) if (cond) if (cond)
- foo; foo; foo;
- else else else
- { { {
- bar; bar; bar;
- } } }
- <
- fN Place the first opening brace of a function or other block in
- column N. This applies only for an opening brace that is not
- inside other braces and is at the start of the line. What comes
- after the brace is put relative to this brace. (default 0).
-
- cino= cino=f.5s cino=f1s >
- func() func() func()
- { { {
- int foo; int foo; int foo;
- <
- {N Place opening braces N characters from the prevailing indent.
- This applies only for opening braces that are inside other
- braces. (default 0).
-
- cino= cino={.5s cino={1s >
- if (cond) if (cond) if (cond)
- { { {
- foo; foo; foo;
- <
- }N Place closing braces N characters from the matching opening
- brace. (default 0).
-
- cino= cino={2,}-0.5s cino=}2 >
- if (cond) if (cond) if (cond)
- { { {
- foo; foo; foo;
- } } }
- <
- ^N Add N to the prevailing indent inside a set of braces if the
- opening brace is in column 0. This can specify a different
- indent for whole of a function (some may like to set it to a
- negative number). (default 0).
-
- cino= cino=^-2 cino=^-s >
- func() func() func()
- { { {
- if (cond) if (cond) if (cond)
- { { {
- a = b; a = b; a = b;
- } } }
- } } }
- <
- :N Place case labels N characters from the indent of the switch().
- (default 'shiftwidth').
-
- cino= cino=:0 >
- switch (x) switch(x)
- { {
- case 1: case 1:
- a = b; a = b;
- default: default:
- } }
- <
- =N Place statements occurring after a case label N characters from
- the indent of the label. (default 'shiftwidth').
-
- cino= cino==10 >
- case 11: case 11: a = a + 1;
- a = a + 1; b = b + 1;
- <
- lN If N != 0 Vim will align with a case label instead of the
- statement after it.
-
- cino= cino=l1 >
- switch (a) { switch (a) {
- case 1: { case 1: {
- break; break;
- } }
- <
- gN Place C++ scope declarations N characters from the indent of the
- block they are in. (default 'shiftwidth'). A scope declaration
- can be "public:", "protected:" or "private:".
-
- cino= cino=g0 >
- { {
- public: public:
- a = b; a = b;
- private: private:
- } }
- <
- hN Place statements occurring after a C++ scope declaration N
- characters from the indent of the label. (default
- 'shiftwidth').
-
- cino= cino=h10 >
- public: public: a = a + 1;
- a = a + 1; b = b + 1;
- <
- pN Parameter declarations for K&R-style function declarations will
- be indented N characters from the margin. (default
- 'shiftwidth').
-
- cino= cino=p0 cino=p2s >
- func(a, b) func(a, b) func(a, b)
- int a; int a; int a;
- char b; char b; char b;
- <
- tN Indent a function return type declaration N characters from the
- margin. (default 'shiftwidth').
-
- cino= cino=t0 cino=t7 >
- int int int
- func() func() func()
- <
- +N Indent a continuation line (a line that spills onto the next) N
- additional characters. (default 'shiftwidth').
-
- cino= cino=+10 >
- a = b + 9 * a = b + 9 *
- c; c;
- <
- cN Indent comment lines after the comment opener, when there is no
- other text with which to align, N characters from the comment
- opener. (default 3). See also |format-comments|.
-
- cino= cino=c5 >
- /* /*
- text. text.
- */ */
- <
- CN When N is non-zero, indent comment lines by the amount specified
- with the c flag above even if there is other text behind the
- comment opener. (default 0).
-
- cino=c0 cino=c0,C1 >
- /******** /********
- text. text.
- ********/ ********/
- < (Example uses ":set comments& comments-=s1:/* comments^=s0:/*")
-
- (N When in unclosed parentheses, indent N characters from the line
- with the unclosed parentheses. Add a 'shiftwidth' for every
- unclosed parentheses. When N is 0 or the unclosed parentheses
- is the first non-white character in its line, line up with the
- next non-white character after the unclosed parentheses.
- (default 'shiftwidth' * 2).
-
- cino= cino=(0 >
- if (c1 && (c2 || if (c1 && (c2 ||
- c3)) c3))
- foo; foo;
- if (c1 && if (c1 &&
- (c2 || c3)) (c2 || c3))
- { {
- <
- uN Same as (N, but for one level deeper. (default 'shiftwidth').
-
- cino= cino=u2 >
- if (c123456789 if (c123456789
- && (c22345 && (c22345
- || c3)) || c3))
- <
- UN When N is non-zero, do not ignore the indenting specified by
- ( or u in case that the unclosed parentheses is the first
- non-white character in its line. (default 0).
-
- cino= or cino=(s cino=(s,U1 >
- c = c1 && c = c1 &&
- ( (
- c2 || c2 ||
- c3 c3
- ) && c4; ) && c4;
- <
- wN When in unclosed parentheses and N is non-zero and either
- using "(0" or "u0", respectively, or using "U0" and the unclosed
- parentheses is the first non-white character in its line, line
- up with the character immediately after the unclosed parentheses
- rather than the first non-white character. (default 0).
-
- cino=(0 cino=(0,w1 >
- if ( c1 if ( c1
- && ( c2 && ( c2
- || c3)) || c3))
- foo; foo;
- <
- mN When N is non-zero, line up a line starting with a closing
- parentheses with the first character of the line with the
- matching opening parentheses. (default 0).
-
- cino=(s cino=(s,m1 >
- c = c1 && ( c = c1 && (
- c2 || c2 ||
- c3 c3
- ) && c4; ) && c4;
- if ( if (
- c1 && c2 c1 && c2
- ) )
- foo; foo;
- <
- *java-cinoptions* *java-indenting*
- jN Indent java anonymous classes correctly. The value 'N' is
- currently unused but must be non-zero (e.g. 'j1'). 'j1' will
- indent for example the following code snippet correctly: >
-
- object.add(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- do_something();
- }
- });
- <
- )N Vim searches for unclosed parentheses at most N lines away.
- This limits the time needed to search for parentheses. (default
- 20 lines).
-
- *N Vim searches for unclosed comments at most N lines away. This
- limits the time needed to search for the start of a comment.
- (default 30 lines).
-
-
- The defaults, spelled out in full, are:
- cinoptions=>s,e0,n0,f0,{0,}0,^0,:s,=s,l0,gs,hs,ps,ts,+s,c3,C0,(2s,us,
- \U0,w0,m0,j0,)20,*30
-
- Vim puts a line in column 1 if:
- - It starts with '#' (preprocessor directives), if 'cinkeys' contains '#'.
- - It starts with a label (a keyword followed by ':', other than "case" and
- "default").
- - Any combination of indentations causes the line to have less than 0
- indentation.
-
- ==============================================================================
- 2. Indenting by expression *indent-expression*
-
- The basics for using flexible indenting are explained in section |30.3| of the
- user manual.
-
- If you want to write your own indent file, it must set the 'indentexpr'
- option. Setting the 'indentkeys' option is often useful. See the
- $VIMRUNTIME/indent directory for examples.
-
-
- REMARKS ABOUT SPECIFIC INDENT FILES ~
-
-
- FORTRAN *fortran-indent*
-
- Block if, select case, and where constructs are indented. Comments, labelled
- statements and continuation lines are indented if the Fortran is in free
- source form, whereas they are not indented if the Fortran is in fixed source
- form because of the left margin requirements. Hence manual indent corrections
- will be necessary for labelled statements and continuation lines when fixed
- source form is being used. For further discussion of the method used for the
- detection of source format see |fortran-syntax|.
-
- Do loops ~
- All do loops are left unindented by default. Do loops can be unstructured in
- Fortran with (possibly multiple) loops ending on a labelled executable
- statement of almost arbitrary type. Correct indentation requires
- compiler-quality parsing. Old code with do loops ending on labelled statements
- of arbitrary type can be indented with elaborate programs such as Tidy
- (http://www.unb.ca/chem/ajit/f_tidy.htm). Structured do/continue loops are
- also left unindented because continue statements are also used for purposes
- other than ending a do loop. Programs such as Tidy can convert structured
- do/continue loops to the do/enddo form. Do loops of the do/enddo variety can
- be indented. If you use only structured loops of the do/enddo form, you should
- declare this by setting the fortran_do_enddo variable in your .vimrc as
- follows >
-
- let fortran_do_enddo=1
-
- in which case do loops will be indented. If all your loops are of do/enddo
- type only in, say, .f90 files, then you should set a buffer flag with an
- autocommand such as >
-
- au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1
-
- to get do loops indented in .f90 files and left alone in Fortran files with
- other extensions such as .for.
-
-
- VERILOG *verilog-indent*
-
- General block statements such as if, for, case, always, initial, function,
- specify and begin, etc., are indented. The module block statements (first
- level blocks) are not indented by default. you can turn on the indent with
- setting a variable in the .vimrc as follows: >
-
- let b:verilog_indent_modules = 1
-
- then the module blocks will be indented. To stop this, remove the variable: >
-
- :unlet b:verilog_indent_modules
-
- To set the variable only for Verilog file. The following statements can be
- used: >
-
- au BufReadPost * if exists("b:current_syntax")
- au BufReadPost * if b:current_syntax == "verilog"
- au BufReadPost * let b:verilog_indent_modules = 1
- au BufReadPost * endif
- au BufReadPost * endif
-
- Furthermore, setting the variable b:verilog_indent_width to change the
- indenting width (default is 'shiftwidth'): >
-
- let b:verilog_indent_width = 4
- let b:verilog_indent_width = &sw * 2
- <
-
- vim:tw=78:ts=8:ft=help:norl:
-